home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Toolbox / Visual Basic Toolbox (P.I.E.)(1996).ISO / lang_ext / vbawk / vb-awk.doc < prev    next >
Encoding:
Text File  |  1994-08-15  |  25.8 KB  |  589 lines

  1.                             INTRODUCTION:
  2.  
  3.  
  4. WHAT IS VB-AWK?
  5.  
  6. VB-AWK is a productivity tool which attempts to simulate the power and
  7. features of the AWK programming language in a Windows environment.
  8. VB-AWK creates native Windows apps using the Visual Basic development
  9. environment, with many of the powerful features and conveniences of AWK.
  10.  
  11. VB-AWK was created by a professional consultant with 14 years
  12. programming experience and expertise in user-interface design. VB-AWK is
  13. copyrighted software which costs 25$.  This fee is required from anyone
  14. who keeps it beyond a 30-day trial period.
  15.  
  16. Those of you who know what AWK is may skip the following section.
  17.  
  18.  
  19. WHAT IS AWK? 
  20.  
  21. AWK is an interpreted, C-like language, most often found on UNIX
  22. platforms, which is highly specialized for the creation of filter
  23. programs.  A filter is a program which uses one or more files for input,
  24. performs an action on those files, and writes them out again.  Filter
  25. programs tend to be very useful as utilities.
  26.  
  27. Virtually any text-processing program may be written in AWK more easily
  28. than (arguably) any other language.  AWK performs all the busywork of
  29. opening, reading, writing, and closing, the files for you, leaving you
  30. free to concentrate on the details of the task to be performed.  AWK is
  31. also very useful for the creation of flat-file databases and almost any
  32. other program whose primary purpose is to manipulate files.
  33.  
  34.  
  35. WHAT ARE THE ADVANTAGES OF USING VB-AWK?
  36.  
  37. 1. PRODUCTIVITY:  You can create very powerful filter programs extremely
  38. easily.  A program to count the number of lines in a file, for instance,
  39. requires writing exactly one line of code, and still contains a friendly
  40. and  powerful GUI user interface. (See the sample program LINECNT).
  41.  
  42. 2. POWER: All programs created with VB-AWK inherit a powerful and
  43. flexible GUI interface, as well as a powerful command-line interface
  44. that's very useful when specified from a Windows program item property.
  45. Additionally, since VB-AWK programs are created from within the Visual
  46. Basic environment, and the "innards" of VB-AWK are completely
  47. accessible, any program that can be created in Visual Basic can also be
  48. created using VB-AWK.
  49.  
  50.  
  51. WHEN WOULD I WANT TO USE VB-AWK?
  52.  
  53. The great thing about VB-AWK is that it makes the creation of
  54. quick-and-dirty utility programs so easy that it becomes time-effective
  55. to write such programs.   For instance, if you need to perform a
  56. complex editing operation on a large number of files, it would be far
  57. easier to write a VB-AWK program to do it than to either do it by hand
  58. or write an editor macro.  It wouldn't be terribly difficult to write a
  59. straight VB program to do it either, but it wouldn't be worth doing if
  60. it would take an hour to write a program that saves 30 minutes of
  61. editing. It would be very worthwhile to spend 5 minutes writing such a
  62. program, however.  That's where VB-AWK comes in.
  63.  
  64. Also, VB-AWK provides a very useful file-processing framework for any
  65. VB program.  VB-AWK will open an arbitrary number of files for you,
  66. feed you each line from the files, write each line back out and close
  67. the file, all without any programming on your part.  Starting out with
  68. VB-AWK will save several hours of programming time on virtually any
  69. program which performs file i/o, even if file processing is not that
  70. program's main purpose.  For instance, many programs will initially open
  71. a configuration file and read setup information.  VB-AWK can do that for
  72. you.
  73.  
  74.  
  75. WHAT BEHAVIORS DO ALL VB-AWK PROGRAMS SHARE?
  76.  
  77. 1. All VB-AWK-generated programs have a specialized file-open dialog
  78. that allows selection of multiple files for the program to operate on.
  79. This dialog appears initially when you run any VB-AWK-created program.
  80. This dialog also has the option of expanding subdirectories, to perform
  81. operations on all files below a given directory.
  82.  
  83. 2. All VB-AWK-generated programs also have a command-line interface
  84. that allows selection of multiple files for the program to operate on,
  85. via standard DOS file specifications with wildcards.  Additionally, a
  86. list file may be specified containing a list of files to execute the
  87. program on.  If any of these command-line options are used to specify
  88. files, the  file-open dialog will automatically be suppressed. 
  89.  
  90. 3. All VB-AWK-generated programs will open every file specified, read 
  91. the contents of the file in either binary or text mode, and pass it to
  92. user-written code for  processing, a line at a time (or a chunk at a
  93. time for binary files).
  94.  
  95. 4. All VB-AWK-generated programs display a status box as they are
  96. processing files.  The status box displays each file's name as it is
  97. being opened.  The status box also will display any errors encountered
  98. as the file is being processed, and a message when all processing is
  99. finished.  The status box can be easily suppressed, and can also be
  100. accessed from user code.  Additionally, it allows you to write the
  101. contents of the box out to a file.
  102.  
  103.  
  104.                     VB-AWK PROGRAMMER'S GUIDE
  105.  
  106.  
  107. HOW TO CREATE A PROGRAM WITH VB-AWK:
  108.  
  109. 1. Create a directory for the program, say \MYPROG.
  110.  
  111. 2. Unzip VB-AWK.ZIP into that directory.  It will create a Visual Basic
  112. project there called VB_AWK.MAK.
  113.  
  114. 3. Fire up Visual Basic and open the VB-AWK.MAK project.  NOTE: 
  115. The project will expect CMDIALOG.VBX to exist in the Windows
  116. system directory on drive C:, C:\WINDOWS\SYSTEM\CMDIALOG.VBX.
  117.  
  118. 4. Implement your program by adding code to the routines in
  119. USERCODE.BAS. See the following section for a description of those
  120. routines.  Many simple programs will not need any other forms or code.
  121. If yours does, you may  create and use any other forms, add modules of
  122. your own, etc.   VB-AWK programs are normal Visual Basic programs in
  123. every way.
  124.  
  125. 5. Debug and test your program from within the VB environment just like
  126. any other VB program, and make an EXE file when it's ready.  The default
  127. name for the EXE file will be VB-AWK.EXE; you'll probably want to rename
  128. it.  
  129.  
  130. 6. You're done!  
  131.  
  132. Note that VB-AWK makes use of common dialogs and requires two files,
  133. CMDIALOG.VBX and COMMDLG.DLL.  These are not part of VB-AWK and are
  134. supplied with Visual Basic.  Also note that VB-AWK was developed under
  135. VB 3.0.  It would probably run under 2.0 with little or no tweaking.
  136.  
  137.  
  138.  
  139. WHERE YOU PUT YOUR CODE:
  140.  
  141. All the code for a VB-AWK program is put in the module USERCODE.BAS.
  142. There are 5 routines there which are stubbed out.  These routines are
  143. called by VB-AWK under various circumstances described in the next 
  144. paragraph.  Writing a VB-AWK  program consists of fleshing out these
  145. routines, none of which are mandatory.   (A VB-AWK program with no
  146. USERCODE routines fleshed out will read files and write them out again
  147. with no modification, listing all the files it processes in the 
  148. status box).
  149.  
  150. The USERCODE routines are as follows:
  151.  
  152.     Function DoALine( TheLine As String) As Integer
  153.         
  154.         This is the workhorse routine and the only one that many
  155.         programs will ever need to flesh out.  DoALine is called
  156.         once for every line in every file being processed.
  157.         'TheLine' is that line.  Your code can do anything it wants
  158.         to TheLine.  VB-AWK will write TheLine back to the file with
  159.         your modifications.
  160.         
  161.         If you wish to skip processing this line completely, set DoALine
  162.         = False, and the line will never be written out.  The stub sets
  163.         it to True which is the typical usage.
  164.  
  165.         Note that VB-AWK opens the input file as #1, and the output
  166.         file as #2.  If you wish to write out more than one line of
  167.         output for each line of input, you may do so by printing to
  168.         #2.  
  169.         
  170.     Function BeforeAFile As Integer
  171.     
  172.         This routine is called once for each file being processed.  It
  173.         is called before the file is opened and any lines are
  174.         read.  Place initialization code here that is required once per
  175.         file.  Many programs won't need anything here.  
  176.         
  177.         BeforeAFile normally returns True.  If your code determines that
  178.         there is some reason to skip processing this file, you can set
  179.         BeforeAFile to False and the file will not be processed.
  180.         
  181.     Sub AfterAFile 
  182.         
  183.         This routine is called once for each file being processed.  It
  184.         is called after a file is completely finished and
  185.         closed.  If there's any cleanup you need to perform after a
  186.         file is processed, put it here.
  187.         
  188.     Function BeforeAllFiles
  189.         
  190.         This routine is called only once, before any files are opened or
  191.         processed in any way.  This is a place to put initialization
  192.         code, if you have any.  This is also the usual place to set
  193.         VB-AWK control variables such as STATUSFILE or APPNAME (see
  194.         below).  It normally returns True; by making it
  195.         return False, you can abort the program before it processes any
  196.         files at all.
  197.         
  198.     Sub AfterAllFiles
  199.         
  200.         This routine is called only once, after all files are processed
  201.         and closed.  This is where you might want to put a "Finished"
  202.         message if you don't like the built-in one.
  203.         
  204.  
  205.  
  206. BUILT-IN VARIABLES:
  207.  
  208. VB-AWK has numerous built-in variables.  Some of them are read-only and
  209. contain valuable information.  Others may be set by the user code and
  210. control certain aspects of VB-AWK's operation.  
  211.  
  212.     Dim FILENAME As String      'read-only
  213.     
  214.         This variable contains the fully-qualified name of the file 
  215.         currently being processed.  
  216.         
  217.     Dim FNR As Long             'read-only
  218.     
  219.         (F)ile (N)umber of (R)ecords.  This contains the number of 
  220.         records that have been read in so far for the current file.
  221.         In text mode one line is considered a record; in binary mode,
  222.         one chunk.     
  223.         
  224.     Dim NR As Long              'read-only
  225.     
  226.         (N)umber of (R)ecords.  This contains the total number of 
  227.         records read in so far, over all files processed.
  228.         
  229.     Dim NF As Integer           'read-only
  230.     
  231.         (N)umber of (F)iles.  This contains the total number of
  232.         files processed so far.    
  233.         
  234.     Dim STATUSBOX As Integer    'control variable
  235.     
  236.         If set to True (the default), indicates that the program makes
  237.         use of the VB-AWK status box.   If set to False (usually in
  238.         BeforeAllFiles), the status box will not appear and status
  239.         messages are thrown into the bit bucket of life.  Setting
  240.         STATUSBOX = False after it has already appeared will not make
  241.         the box disappear, but will disable messages to it, just like
  242.         setting STATUSMESSAGES to False.
  243.         
  244.     Dim STATUSFILE As Integer   'control variable
  245.     
  246.         If set to True, then WriteToStatus will write to a file called
  247.         VB-AWK.LOG in the current directory.  STATUSBOX and STATUSFILE
  248.         are compatible; if they are both set to TRUE, messages will be
  249.         sent to the file and echoed to the status box too.  The default
  250.         value is False.
  251.         
  252.     Dim STATUSMESSAGES As Integer
  253.     
  254.         If set to True (the default) indicates that the program wishes to
  255.         make use of the standard VB-AWK status messages.  These consist of
  256.         a message that says "Processing file nnn..." when each file is
  257.         opened for processing, which has the string "finished!" appended
  258.         to it when processing is finished, and a message "Finished
  259.         with all files!" at the end.
  260.         
  261.     Dim BINARYMODE As Integer   'control variable
  262.     
  263.         When BINARYMODE is False (the default), files are read in text
  264.         mode.  Each time DoALine is called, it is passed the current 
  265.         line of the file, as delineated by carriage-return/line feed.
  266.         The terminating cr/lf is not passed.
  267.         
  268.         If BINARYMODE is set to True (typically in the BeforeAllFiles
  269.         routine), DoALine is passed a chunk of bytes from the file.
  270.         The length of the chunk is given by RECLEN (see below).  All
  271.         characters, including control characters and cr/lf, are in
  272.         the chunk.
  273.         
  274.     Dim RECLEN As Long          'control variable
  275.     
  276.         Holds record length for binary files, which will typically be
  277.         set in BeforeAllFiles or BeforeAFile. It is ignored for text
  278.         files.
  279.         
  280.     Dim APPNAME As String       'control variable
  281.     
  282.         May be set to the name of your application, whatever you wish
  283.         it to be known as.  This will customize the captions in the
  284.         VB-AWK file-open dialog and status box.    
  285.  
  286.     Dim COMPAREMODE As Integer  'control variable
  287.         
  288.         If COMPAREMODE is set to COMPARE_CASESENSITIVE (value 0), then
  289.         the 'gsub' subroutine and any other VB-AWK string processing
  290.         routines will be case-sensitive.  If set to 
  291.         COMPARE_CASEINSENSITIVE, then all such routines will be case
  292.         insensitive.  The default is COMPARE_CASEINSENSITIVE.
  293.         
  294.  
  295. SYSTEM ROUTINES:        
  296.  
  297. You can access the status box through the following routines:
  298.  
  299.     Subroutine WriteToStatus( TheStr As String)
  300.     
  301.         Appends a line consisting of 'TheStr' to the status message box.
  302.         If STATUSBOX is set to FALSE, this routine will also do nothing.
  303.  
  304.     Subroutine AppendToStatus( TheStr As String)
  305.     
  306.         Appends a string, 'TheStr', to the current line on the status
  307.         box.  If STATUSBOX is set to FALSE, this routine will do 
  308.         nothing.
  309.         
  310. The status box has a capacity of about 64K worth of messages; if you
  311. attempt to write more than that, a message box will inform you that
  312. memory has overflowed and the list box will be cleared of messages.
  313. If there's much chance of that happening, you're better off setting
  314. STATUSBOX to False and STATUSFILE to True, sending all messages to
  315. VB-AWK.LOG. 
  316.                            
  317.  
  318. UTILITY ROUTINES:
  319.  
  320. VB-AWK contains a number of "the routines that Microsoft forgot", as
  321. well as some routines borrowed from AWK.   These routines can save many
  322. hours of programming time.  They are found in a file called UTILS.BAS,
  323. which at present contains the following routines:
  324.  
  325.     Function gsub (TheString As String, SearchFor As String, 
  326.                    Subst As String) As Integer
  327.                    
  328.         This is an AWK utility which performs a global substitutions
  329.         within a text string.  It will look in TheString for occurrences
  330.         of SearchFor, and replace each occurrence with Subst.  It 
  331.         returns the number of replacements actually made.
  332.  
  333.     Function StrTok (ByVal TokenStr As String, 
  334.                      Delimiters As String) As String
  335.     
  336.         This is borrowed from the 'C' language function by the same name
  337.         and behaves very similarly. StrTok parses a string, TokenStr,
  338.         which is treated like it consists of tokens separated by
  339.         delimiters. Each Time you call StrTok, it returns the next token
  340.         in the string.
  341.  
  342.         The first time you call it, TokenStr should be the string to
  343.         parse, and Delimiters is the string containing characters that
  344.         delimit the tokens. For instance, if the tokens are separated by
  345.         either commas or blanks, Delimiters should be the following:  
  346.         " ,"
  347.  
  348.         On succeeding calls to StrTok, TokenStr should be a zero- length
  349.         string ("").  StrTok will remember what TokenStr was. However,
  350.         Delimiters can be anything you want it to be; thus, you can look
  351.         for different delimiters on succeeding calls.
  352.         
  353.         StrTok returns "" when it can find no more tokens.
  354.  
  355.         
  356.     Sub Substitute (TheText$, StartLoc%, TheLen%, Subst$)
  357.     
  358.         This routine replaces part of one string with another.  It
  359.         replaces the part of TheText$ which starts at StartLoc% and
  360.         has length of TheLen%, and replaces it with Subst$.  
  361.         
  362.         This routine appears to have the same behavior as using Mid$ on
  363.         the left side of an assignment, but Mid$ will truncate the
  364.         substitution string if it is longer than what it is replacing,
  365.         while this routine does not.
  366.  
  367.     Function ReverseString( TheStr As String) As String
  368.     
  369.         This function returns a string which contains all the characters
  370.         of TheStr in reverse order.
  371.         
  372.     
  373.     Sub SplitFilePath (ByVal ThePath$, TheDrive$, TheDirs$, TheFile$, 
  374.                        TheExtension$)    
  375.             
  376.         This routine accepts a file pathname as ThePath$, and splits it 
  377.         into its component parts.  If ThePath$ contained a drive 
  378.         specifier, it returns it in TheDrive$; if it contained directory
  379.         specifiers they are returned in TheDirs$; it returns the
  380.         file name, minus extension, in TheFile$; and it returns the
  381.         extension, if any, in TheExtension$.  If ThePath$ is missing
  382.         any of these qualifiers, the corresponding string is set to "".
  383.         
  384.     Function FileExists (Filename As String) As Integer
  385.  
  386.         Returns TRUE if the given filename exists, otherwise
  387.         returns FALSE.
  388.  
  389.         
  390. COMMAND-LINE INTERFACE:
  391.  
  392. The command-line interface for a VB-AWK-created program called MYPROG is
  393. as follows:
  394.  
  395.     MYPROG  filespec
  396.     
  397.         This will launch MYPROG so it will process all files specified
  398.         by 'filespec', which can contain any valid DOS wildcards.  A
  399.         planned enhancement is to allow more than one filespec on the
  400.         command line.  You can work around the current limitation by
  401.         using a listfile as described in the next paragraph.
  402.         
  403.         
  404.     MYPROG  @listfile
  405.     
  406.         This will launch MYPROG so it operates on all the files 
  407.         specified in the listfile named  'listfile'.  'listfile'
  408.         should contain a list of files (or filespecs), left justified,
  409.         with each filespec on its own line.
  410.         
  411.     MYPROG
  412.     
  413.         Specifying no command-line parameter will cause the file-open
  414.         dialog to appear initially, allowing the user to pick whatever
  415.         files he or she wants.
  416.         
  417. Note that if a command line is specified, the file-open dialog will be
  418. suppressed.        
  419.  
  420.  
  421.                             SAMPLE PROGRAMS:
  422.                         
  423.  
  424. A number of useful utilities have been written using VB-AWK to 
  425. demonstrate its capabilities.  The simplest one, LINECNT, is supplied as
  426. an executable so that you may easily see the user interface VB-AWK
  427. supplies.   The others are source code only and can easily be built by
  428. following the directions for creating a VB-AWK app, then adding the
  429. appropriate files to the project.   Each of  these utilities exhibits all
  430. the standard VB-AWK behaviors described previously.
  431.  
  432.  
  433.  
  434.     LINECNT (Line Count)
  435.  
  436.         Counts the number of lines in each file chosen and displays the
  437.         line count of each.  This requires writing exactly one line of
  438.         code.  To make it display the grand sum over all files would
  439.         require exactly one more line of code; as the textbooks say, 
  440.         we'll leave it up to the reader for an exercise to determine 
  441.         what that line is and where it goes.
  442.         
  443.         NOTE: LINECNT.EXE, like all VB 3.0 executables, requires 
  444.         VBRUN300.DLL to be in your Windows directory or windows/system.
  445.         This is not included in VB-AWK but is part of VB 3.0.
  446.         
  447.         ANOTHER NOTE: LINECNT.EXE opens files in text mode (i.e.,
  448.         BINARYMODE = False).   Don't run it on binary files such as
  449.         EXE files. It will truncate them if they contain an EOF
  450.         character.
  451.                           
  452.         HOW TO BUILD IT:  The source code is in the file LINECNT.USR.
  453.         Unzip VB-AWK.ZIP, copy LINECNT.USR on top of USERCODE.BAS, and
  454.         build the executable from VB.
  455.  
  456.     ENTAB   
  457.         
  458.         Substitutes tabs for strings of blanks.  Allows
  459.         custom-specifying the desired tab stops or specifying fixed
  460.         tabs.  (Note: ENTAB expects there will be no tabs in the 
  461.         file already.   If this is not the case, you can run DETAB on
  462.         it first and then run ENTAB).
  463.         
  464.         HOW TO BUILD IT:  The source code is in ENTAB.USR, and one form
  465.         that's required is in SETTABST.FRM.  Unzip VB-AWK.ZIP, copy
  466.         ENTAB.USR on top of USERCODE.BAS, then from VB, add SETTABST.FRM
  467.         to the project and build your executable.
  468.  
  469.     DETAB
  470.         
  471.         Expands tabs in a file to blanks.  Allows custom-specifying the
  472.         desired tab stops or specifying fixed tabs.
  473.         
  474.         HOW TO BUILD IT:  The source is in DETAB.USR, and it also uses
  475.         the form SETTABST.FRM.  It is built the same way ENTAB is.
  476.         
  477.     MULTIGREP
  478.     
  479.         This is an extremely powerful search-and-replace utility.  
  480.         It allows you to specify multiple strings to search for and
  481.         replace, and allows you to store sets of search-and-replace
  482.         information to be retrieved and run again.  This can be 
  483.         extremely useful in situations where numerous files (source 
  484.         files for instance) are identical except for identifiers 
  485.         or other tokens that are different.
  486.         
  487.         HOW TO BUILD IT:  The source is in MULTIGRE.USR, which 
  488.         needs to be renamed to USERCODE.BAS, and there are two forms
  489.         it requires, namely FILESAVE.FRM and MULTIGRE.FRM.  As usual,
  490.         just get into VB and add the necessary forms, then build the
  491.         executable.
  492.         
  493. Here are some more which are so simple they are left as an "exercise
  494. for the reader":        
  495.         
  496.     FILELIST
  497.     
  498.         This one does nothing but list the files the user selects.  It
  499.         is interesting because, by writing the list to a file, you can
  500.         use that file as file-list input to VB-AWK so as to permanently
  501.         save that set of files as input to other VB-AWK utilities.  
  502.         Here's how it's done:  in BeforeAllFiles, set STATUSMESSAGES to
  503.         FALSE.  In BeforeAFile, say "WriteToStatus FILENAME" and change
  504.         BeforeAFile's return value to False, since you're only interested
  505.         in the file's name, not its contents.  Then, run the program,
  506.         click on the Save button from the status box, and you're golden.
  507.         Or, if you can't stand the extra mouse click of saving from
  508.         the status box, just set STATUSFILE to True in BeforeAllFiles,
  509.         and the file list will end up in VB-AWK.LOG.
  510.         
  511.     DELPROT
  512.     
  513.         Don't you find it annoying trying to delete protected files?  
  514.         To do so from the Windows File Manager takes a protracted 
  515.         series of mouse clicks and keystrokes which gets tedious
  516.         quickly. Writing a VB-AWK program to delete whatever protected 
  517.         files the user selects takes only two or three lines of code,
  518.         or a few more if you really want to get fancy.  Just make sure 
  519.         you set the return value of BeforeAFile to False so it doesn't 
  520.         try to read the file after you delete it.
  521.         
  522.     MAKEBATCH
  523.     
  524.         VB-AWK is great for generating giant batch files if you still
  525.         deal with DOS on occasion.  Generally, if you have two or three
  526.         DOS operations you need to perform on a bunch of files, it takes
  527.         two or three lines of Visual Basic to write a program that will
  528.         create that batch file for any files you select. 
  529.  
  530.  
  531. THE COMPANY THAT BRINGS YOU VB-AWK:
  532.  
  533.     
  534.                 SYNERGY Software & Services, Inc.
  535.                 46 Little Brook Rd.
  536.                 Wilton, CT 06897
  537.                 (203) 761-0749
  538.                 Compu-Serve: 73467,3661
  539.                 
  540.  
  541. SYNERGY is a consulting company whose primary purpose is to market
  542. the skills of myself, SYNERGY'S owner and VB-AWK's author, Richard
  543. Robbins.  I have 14 years experience as a professional
  544. programmer, with expertise in C, C++, Visual Basic, Realizer Basic,
  545. Prolog (not that anyone cares about Prolog!), user interface
  546. design, and scientific/engineering programming.  If you have any 
  547. needs along these lines, feel free to contact me.
  548.  
  549.  
  550. LICENSING AGREEMENT:   
  551.  
  552. VB-AWK is copyrighted software, with all rights reserved by SYNERGY
  553. Software & Services, Inc.  An individual-use license costs 25$,
  554. payable at the end of a 30-day free trial period.  Keeping the 
  555. software longer than 30 days indicates acceptance of these terms.
  556.  
  557. The individual-use license  gives you the right to develop
  558. VB-AWK-based programs for your private, nonprofit use only.  It does
  559. not give you the right to distribute any VB-AWK-based programs
  560. publicly, whether for profit or not.  It does not give you the right
  561. to directly profit from any VB-AWK-based program.  It DOES give you
  562. the right to develop and use VB-AWK-based programs in the course of
  563. your work and on behalf of your clients or customers, and it gives you
  564. the right to distribute a limited number (no more than 10) of copies
  565. of VB-AWK-based programs to your immediate clients or customers, so
  566. long as you do not charge them for it.
  567.  
  568. If you wish to develop for-profit software based on VB-AWK or
  569. incorporating VB-AWK code, please contact SYNERGY.  You will find our
  570. terms to be extremely reasonable. We have no desire to unfairly limit
  571. competition (unlike Microsoft!), merely the desire to be fairly
  572. rewarded for our efforts.
  573.  
  574. Your honesty and integrity regarding the licensing agreement for
  575. VB-AWK will enable SYNERGY to continue developing it and other fine
  576. products for the shareware community.  Thank you in advance for your
  577. cooperation.
  578.  
  579.  
  580. DISCLAIMER: 
  581.  
  582. In today's litigious age, no product is complete without a
  583. disclaimer, so here's VB-AWK's:  You use VB-AWK entirely at your own
  584. risk.  We think it works great, and the sample programs too, but
  585. nonetheless there could be bugs in it and undoubtedly are.  VB-AWK
  586. carries no warranty of any kind, expressed or implied, and SYNERGY
  587. is not responsible for any damages resulting from any use of VB-AWK.
  588.  
  589.